#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <error.h>
#define SIZE 1024
int main()
{
	// 要创建一个共享内存段的id
	int shmid ;
	// 共享内存的映射地址
	char *shmaddr ;
	// int flag = 0 ;
	// 子进程的id
	int pid ;
	// 创建一个共享内存；IPC_PRIVATE：自动指定一个键值；SIZE：共享内存大小，以字节为单位
	// IPC_CREAT：如果指定的共享内存段不存在，则创建一个新的共享内存段
	// 返回值：共享内存的ID；
	shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600 ) ;
	// 如果共享内存创建失败
	if ( shmid < 0 )
	{
		perror("get shm error") ;
		return -1 ;
	}
	// 创建子进程
	pid = fork() ;
	if ( pid == 0 )
	{
		// 映射（挂接）共享内存地址
		shmaddr = (char *)shmat( shmid, NULL, 0 ) ;
		if ( shmaddr == (char *) -1 )
		{
			perror("shmat addr error\n") ;
			return -1 ;
		}
		// 向共享内存中写入信息
		strcpy( shmaddr, "你好！我是子进程!\n") ;
		sleep(5);
		printf("%s", shmaddr) ;
		// 解除映射
		shmdt( shmaddr ) ;
		return 0;
	} else if ( pid > 0) {
		sleep(3 ) ;
		shmaddr = (char *) shmat(shmid, NULL, 0 ) ;
		if ( shmaddr == (char *) -1 )
		{
			perror("shmat addr error") ;
			return -1 ;
		}
		printf("%s", shmaddr) ;
		strcpy( shmaddr, "我是父进程，已经收到信息!\n") ;
		// 解除映射
		shmdt( shmaddr ) ;
		sleep(5);
		// IPC_RMID：删除共享内存段
		shmctl(shmid, IPC_RMID, NULL) ;
	}else{
		 perror("fork error");
		shmctl(shmid, IPC_RMID, NULL) ;
	}
	return 0;
}

